const defaultConfig = {
	baseURL: '',
	header: {},
	method: 'GET',
	dataType: 'json',
	// #ifndef MP-ALIPAY
	responseType: 'text',
	// #endif
	custom: {},
	// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
	timeout: 60000,
	// #endif
	// #ifdef APP-PLUS
	sslVerify: true,
	// #endif
	// #ifdef H5
	withCredentials: false,
	// #endif
	// #ifdef APP-PLUS
	firstIpv4: false,
	// #endif
	validateStatus: function validateStatus(status) {
		return status >= 200 && status < 300
	}
}
class Http {
	/**
	 * @param {Object} arg - 全局配置
	 * @param {String} arg.baseURL - 全局根路径
	 * @param {Object} arg.header - 全局header
	 * @param {String} arg.method = [GET|POST|PUT|DELETE] - 全局默认请求方式
	 * @param {String} arg.dataType = [json] - 全局默认的dataType
	 * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
	 * @param {Object} arg.custom - 全局默认的自定义参数
	 * @param {Number} arg.timeout - 全局默认的超时时间，单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序（2.10.0）、支付宝小程序
	 * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持（HBuilderX 2.3.3+）
	 * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证（cookies）。默认false。仅H5支持（HBuilderX 2.6.15+）
	 * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
	 * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
	 */
	constructor(arg = {}) {
		this.config = Object.assign(defaultConfig, arg)
		this.intercept = {
			request: null,
			response: null
		}
	}
	setConfig(f) {
		this.config = Object.assign(this.config, f(this.config))
	}
	/**
	 * 合并斜杆
	 */
	mergedSlash(url){
		let a = url.replace('://','****')
		return  a.replace(/\/\//,'/').replace('****','://')
	}
	/**
	 * 封装请求（async await 封装uni.request）
	 * @param {string} method  post/get/put/delete
	 * @param {string} endpoint  接口方法名
	 * @param {object} data  所需传递参数
	 * @param {boolean} load  是否需要loading
	 */
	async req(method, endpoint, data, load = true) {
		if (load) {
			uni.showNavigationBarLoading();
		}
		let url = this.mergedSlash(`${this.config.baseUrl}${endpoint}`) ;
		let options = {
			...this.config,
			url,
			data,
			method
		}
		if (typeof this.intercept.request === 'function') {
			options = this.intercept.request(options)
		}
		let [error, res] = await uni.request(options);
		if(error){
			console.log(error,'接口报错')
			throw error.errMsg
		}
		if (load) {
			uni.hideNavigationBarLoading();
		}
		if (typeof this.intercept.request === 'function' && this.intercept.response(res)) return this.intercept
			.response(res)
		return res?.data || {}
	}
	async get(url, data, load = false) {
		return await this.req('get', url, data, load)
	}
	async post(url, data, load = false) {
		return await this.req('post', url, data, load)
	}
	async put(url, data, load = false) {
		return await this.req('put', url, data, load)
	}
	async delete(url, data, load = false) {
		return await this.req('delete', url, data, load)
	}
}
export default Http
